// 使用正则库
use regex::Regex;


pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // 正则表达式提取输入的数字和原始的进制
    let pattern = Regex::new(r"(\d+)\((\d+)\)").unwrap();
    let mut origin_num: u32 = 0;
    let origin_base: u32;
    if let Some(cap) = pattern.captures(num_str) {
        // 获取原始数字的字符串
        let origin_num_str = cap
            .get(1)
            .unwrap()
            .as_str();
        // 获取原始进制
        origin_base = cap
            .get(2)
            .unwrap()
            .as_str()
            .parse()
            .unwrap();
        // 反向迭代字符串中的字符，即从低位向高位解析，
        // 将原始数字转换为十进制数，使用ASICC表进行字符与数字之间的转换
        for (i, c) in origin_num_str.chars().rev().enumerate() {
            let bit = if (c as u8) < 97 {
                c as u8 - 48
            } else {
                c as u8 - 87
            } as u32;
            origin_num += origin_base.pow(i as u32) * bit;
        }
        let mut res = String::new();
        let mut num = origin_num;
        // 利用辗转相除法转换为目标进制，同样使用ASICC进行字符与数字之间的转换
        loop {
            let remainder = num % to_base;
            num = num / to_base;
            if remainder < 10 {
                res.push((remainder + 48) as u8 as char);
            } else {
                res.push((remainder + 87) as u8 as char);
            }
            if num == 0 {
                break;
            }
        }
        res.chars().rev().collect::<String>()
    } else {
        panic!("captures failed");
    }
}
